<!--
app.vue是主入口文件
默认首页是views/main.vue
-->
<template>
	<div id="app" class="body-page">
		<el-backtop target=".body-page"> <i class="el-icon-caret-top"></i></el-backtop>
		<!-- 注意1：如果使用keep-alive存活路由页面 则需要处理额外的画赙，比如销毁事件中的处理 -->
		<!-- 注意2： 本页是最上层容器，目前的结构设计上不会有beforeDestroy事件。-->
		<router-view></router-view>
	</div>
</template>
<script>

	/*加载资源*/
	import { mixins } from '@/mixins/mixins'
    import { mapState, mapMutations, mapGetters,mapActions } from 'vuex'
	import * as type from '@/store/mapMutations' //mutations方法名映射
    import { balanceOf, getTrxToTokenOutputPrice, hex2Num, loadAuthInfo } from "@/libs/tron.lib";
	import { getTrxPrice, setLocalStorage } from '@/libs/site.utils';
	// import { debug } from '@/libs/xg.tron.lib'
	import { API_QUERY_UNACTIVE } from '@/axios/api'
	import { EVENT_LOADINITDATA } from '@/libs/site.utils'

    const LOGIN_TIMERLIMIT = 2000 //登录状态实时检测间隔
	const REFRESH_TIMELIMIT = 60000 //定时刷新相关数数据间隔
	const UNACTIVE_TIMELIMIT = 60000 //未激活下线请求定时器间隔

	let debug = false
	//导出
	export default {
		name: "app",
		mixins:[mixins],
		data () {
			return {
				autoLoginInterval: null,//登录定时器
				loadInfoInterval : null, //加载个人信息定时器
				unactiveInterval : null //未激活下线请求定时器
			}
		},
		computed: {
			...mapState(['tornlinkToken','xg']),//映射普通数据
			...mapGetters(['isLogin'])// 映射计算数据
		},
		created () {
            let that = this;
            debug && console.log('app创建')
            window.addEventListener('beforeunload', ()=>{localStorage.removeItem('sender');});	//关闭清除sender缓存
            // this[type.GET_SUPER_USER]();//从服务器加载超级用户, 在uc页面加载就可以

            // 注意，这里本来是一个async修饰方法
            that.autoLoginInterval = setInterval(() => {

	            debug && console.log('执行登录判断定时器')
				//如果登录信息是null，才进行处理
                if (that.isLogin === false) {
	                debug && console.log('>>还没有登录,继续处理')
                    //如果有tronWeb对象，并且已经登录
                    if (window.tronWeb && window.tronWeb.defaultAddress.base58) {
	                    debug && console.log('>>>>有tronWeb对象，并且对象中有登录者的钱包token')
                        clearInterval(that.autoLoginInterval); //如果成功登录，才会清除定时器，防止重复执行
                        let sender = window.tronWeb.defaultAddress.base58;
                        that[type.SET_SENDER](sender);
                        that[type.SET_TOKEN](sender);
                        setLocalStorage('sender',sender) //放到本地储存中，供钱包事件监听使用
                        //读取xg余额
                        balanceOf(that.xg.address, sender, (hold) => {
                            that[type.SET_XG_BALANCE](hex2Num(hold, that.xg.decimal))
                        });
                        //读取推荐码
                        loadAuthInfo(sender, (code) => {
                            that[type.SET_CODE](code)
                        });

                        that.refreshData();

                    } else {
	                    debug && console.log('>>>>没有tronWeb对象或钱包插件没有登录')
                        //如果有插件对象，但没有登录，也要初始化信息
                        if (window.tronWeb && window.tronWeb.fullNode.host == 'http://127.0.0.1') { //钱包未登录
	                        debug && console.log('>>>>>>>没有tronWeb对象，并且fullNdde.host')
                            window.tronWeb = new TronWeb({
                                fullHost: "https://api.trongrid.io/"
                                // fullHost: "https://api.shasta.trongrid.io" //测试网，用于没登录钱包时使用
                            });
                            that.refreshData();
                        }
                    }

					//如果没有tronWeb对象（钱包插件没有注入到window中），则用js中的来创建一个对象
                    if (!window.tronWeb) {
	                    debug && console.log('>>>>>>没有tronWeb对象')
                        window.tronWeb = new TronWeb({
                            fullHost: "https://api.trongrid.io/"
                            // fullHost: "https://api.shasta.trongrid.io" //测试网，用于没登录钱包时使用
                        });

                        that.refreshData();
                    }


                }
                //如果没登录end
            }, LOGIN_TIMERLIMIT);

            //请求未激活下线数
			this[type.QUERY_UNACTIVE]()
			//并且定时请求未激活下线数
			this.unactiveInterval = window.setInterval(() => {
				this[type.QUERY_UNACTIVE]()
			},UNACTIVE_TIMELIMIT)

		},
		mounted () {
		},
		methods:{

		    //映射store中的方法
            ...mapMutations([
                type.SET_SENDER,
                type.SET_TRX_PRICE,
                type.SET_TOKEN_USDT_PRICE,
                type.SET_TOKEN,
                type.SET_XG_BALANCE,
                type.SET_TRX,
                type.SET_CODE,
            ]),
			...mapActions([
			    type.QUERY_UNACTIVE,
                // type.GET_SUPER_USER,
            ]),

			//发送初始化数据事件给各个页面，注意，如果使用keep-alive来存活页面，事件名称可能会有问题
            initData () {
	            // console.log('定时发送事件：initData-' + (new Date()).getTime())
	            this.$root.eventHub.$emit(EVENT_LOADINITDATA,null)
            },

            // 需要定时刷新的数据
            refreshData () {
                let that = this;
	            //读取trx价格
                that.loadPrice();
	            //注意，需要在这里发送初始数据加载事件，因为本页是已经读取到相关钱信息放到store之后才发送的
	            //否则在各自页面中读取，会脱离这个顺序提前加载，而store是空的，就加载不到数据，后续解决方式是给store加持久化
                that.initData();

                //由于本方法会一直执行，虽然inerval是重复赋值给一个对象，但每次都会重复创建一个新的定时器，所以下面每次都要先涂除
                if (typeof that.loadInfoInterval !== "undefined") {
                    clearInterval(that.loadInfoInterval);
                }
                //定时加载新的数据
                that.loadInfoInterval = setInterval(() => {
                    that.loadPrice();
                    that.initData();
                }, REFRESH_TIMELIMIT);
            },


            /**
             *获取trx价格   计算出代币价格   U本位
             */
            loadPrice () {
	            let that = this
	            // debug && console.log('执行loadPrice()>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>');
	            getTrxPrice((price) => {
		            if (price != "NAN") {
			            // console.log('>>加载到了trx价格')
			            that[type.SET_TRX_PRICE](price)
		            }
		            getTrxToTokenOutputPrice(that.xg.pairAddress, that.sender, 1000, (amount) => {
			            if (amount != "NAN") {
				            // console.log('>>加载到了trx兑换xg的价格')
				            let _toUstd = (hex2Num(amount, 6) / 1000 * Math.pow(10, that.xg.decimal)) * that.trxPrice;
				            that[type.SET_TOKEN_USDT_PRICE](_toUstd)
			            }
		            });

		            //如果要使用持久化，这里就不需要自己储存
		            //注意，这里没有放在上面的if里面，是因为本来就有默认初始值
		            localStorage.setItem("trxPrice", that.trxPrice);
		            localStorage.setItem("toUsdtPrice", that.xg.toUsdtPrice);
	            });
	            //获取trx余额(登录情况下)
	            if (that.isLogin === true) {
		            tronWeb.trx.getBalance(that.sender).then(amount => {
			            let _trxBalance = hex2Num(tronWeb.toHex(amount), 6);
			            that[type.SET_TRX](_trxBalance)
			            // console.log('读取到了trx余额：', _trxBalance)
		            })
	            }
            }
		},
		beforeDestroy () {
			//考虑是否要销毁定时器，由于本文件是主vue文件，不会被切换，暂时不需要销毁
		}
	};



</script>

<style lang="less">
	/*公共变量*/
	@import '~@/assets/global.less';
	/**********************适应************************/
	@media screen and (max-width: @MINSCREEN){
		.body-page {height: 100vh;overflow-x: hidden}
	}
</style>
